home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / WINPROGS / WUNZ20SR.ZIP / FILE_IO.C < prev    next >
C/C++ Source or Header  |  1993-05-11  |  36KB  |  1,166 lines

  1. /*---------------------------------------------------------------------------
  2.  
  3.   file_io.c
  4.  
  5.   This file contains routines for doing direct input/output, file-related
  6.   sorts of things.  Most of the system-specific code for unzip is contained
  7.   here, including the non-echoing password code for decryption (bottom).
  8.  
  9.   ---------------------------------------------------------------------------*/
  10.  
  11.  
  12. #if (!defined(__GO32__) && !defined(NeXT))
  13. #  define const
  14. #endif
  15.  
  16. #define FILE_IO_C
  17. #include "unzip.h"
  18.  
  19. #ifdef  MSWIN
  20. #  include "wizunzip.h"
  21. char __based(__segname("STRINGS_TEXT")) szDiskError[] = \
  22.     "A write error has occurred. Perhaps the disk is full. Continue ?";
  23.  
  24. #endif
  25.  
  26.  
  27. /************************************/
  28. /*  File_IO Local Prototypes, etc.  */
  29. /************************************/
  30.  
  31. #if (!defined(DOS_OS2))
  32.    static int dos2unix __((unsigned char *buf, int len));
  33.    int CR_flag = 0;      /* when last char of buffer == CR (for dos2unix()) */
  34. #endif
  35.  
  36. #ifdef OS2
  37.    extern int   longname;          /* set in mapname.c */
  38.    extern char  longfilename[];
  39. #endif
  40.  
  41. #ifdef CRYPT
  42. #  if (defined(DOS_OS2) || defined(VMS))
  43. #    define MSVMS
  44. #    ifdef DOS_OS2
  45. #      ifdef __EMX__
  46. #        define getch() _read_kbd(0, 1, 0)
  47. #      else
  48. #        ifdef __GO32__
  49. #          include <pc.h>
  50. #          define getch() getkey()
  51. #        else /* !__GO32__ */
  52. #          include <conio.h>
  53. #        endif /* ?__GO32__ */
  54. #      endif
  55. #    else /* !DOS_OS2 */
  56. #      define getch() getc(stderr)
  57. #      define OFF 0   /* for echo control */
  58. #      define ON 1
  59. #      define echoff(f) echo(OFF)
  60. #      define echon()   echo(ON)
  61. #      include <descrip.h>
  62. #      include <iodef.h>
  63. #      include <ttdef.h>
  64. #      if !defined(SS$_NORMAL)
  65. #        define SS$_NORMAL 1   /* only thing we need from <ssdef.h> */
  66. #      endif
  67. #    endif /* ?DOS_OS2 */
  68. #  else /* !(DOS_OS2 || VMS) */
  69. #    ifdef TERMIO       /* Amdahl, Cray, all SysV? */
  70. #      ifdef CONVEX
  71. #        include <sys/termios.h>
  72. #        include <sgtty.h>
  73. #      else /* !CONVEX */
  74. #        ifdef LINUX
  75. #          include <termios.h>
  76. #        else /* !LINUX */
  77. #          include <sys/termio.h>
  78. #        endif /* ?LINUX */
  79. #        define sgttyb termio
  80. #        define sg_flags c_lflag
  81. #      endif /* ?CONVEX */
  82.        int ioctl OF((int, int, voidp *));
  83. #      define GTTY(f,s) ioctl(f,TCGETA,(voidp *)s)
  84. #      define STTY(f,s) ioctl(f,TCSETAW,(voidp *)s)
  85. #    else /* !TERMIO */
  86. #      if (!defined(MINIX) && !defined(__386BSD__))
  87. #        include <sys/ioctl.h>
  88. #      endif /* !MINIX && !__386BSD__ */
  89. #      include <sgtty.h>
  90. #      ifdef __386BSD__
  91. #        define GTTY(f, s) ioctl(f, TIOCGETP, (voidp *) s)
  92. #        define STTY(f, s) ioctl(f, TIOCSETP, (voidp *) s)
  93. #      else /* !__386BSD__ */
  94. #        define GTTY gtty
  95. #        define STTY stty
  96.          int gtty OF((int, struct sgttyb *));
  97.          int stty OF((int, struct sgttyb *));
  98. #      endif /* ?__386BSD__ */
  99. #    endif /* ?TERMIO */
  100.      int isatty OF((int));
  101.      char *ttyname OF((int));
  102. #    if (defined(PROTO) && !defined(__GNUC__) && !defined(_AIX))
  103.        int open (char *, int, ...);
  104. #    endif
  105.      int close OF((int));
  106.      int read OF((int, voidp *, int));
  107. #  endif /* ?(DOS_OS2 || VMS) */
  108. #endif /* CRYPT */
  109.  
  110.  
  111.  
  112.  
  113.  
  114. /******************************/
  115. /* Function open_input_file() */
  116. /******************************/
  117.  
  118. int open_input_file()    /* return non-zero if open failed */
  119. {
  120.     /*
  121.      *  open the zipfile for reading and in BINARY mode to prevent cr/lf
  122.      *  translation, which would corrupt the bitstreams
  123.      */
  124.  
  125. #ifdef VMS
  126.     zipfd = open(zipfn, O_RDONLY, 0, "ctx=stm");
  127. #else /* !VMS */
  128. #ifdef UNIX
  129.     zipfd = open(zipfn, O_RDONLY);
  130. #else /* !UNIX */
  131. #ifdef MACOS
  132.     zipfd = open(zipfn, 0);
  133. #else /* !MACOS */
  134.     zipfd = open(zipfn, O_RDONLY | O_BINARY);
  135. #endif /* ?MACOS */
  136. #endif /* ?UNIX */
  137. #endif /* ?VMS */
  138.     if (zipfd < 1) {
  139.         fprintf(stderr, "error:  can't open zipfile [ %s ]\n", zipfn);
  140.         return (1);
  141.     }
  142.     return 0;
  143. }
  144.  
  145.  
  146.  
  147.  
  148.  
  149. /**********************/
  150. /* Function readbuf() */
  151. /**********************/
  152.  
  153. int readbuf(buf, size)
  154.     char *buf;
  155.     register unsigned size;
  156. {                               /* return number of bytes read into buf */
  157.     register int count;
  158.     int n;
  159.  
  160.     n = size;
  161.     while (size) {
  162.         if (incnt == 0) {
  163.             if ((incnt = read(zipfd, (char *)inbuf, INBUFSIZ)) <= 0)
  164.                 return (n-size);
  165.             /* buffer ALWAYS starts on a block boundary:  */
  166.             cur_zipfile_bufstart += INBUFSIZ;
  167.             inptr = inbuf;
  168.         }
  169.         count = MIN(size, (unsigned)incnt);
  170.         memcpy(buf, inptr, count);
  171.         buf += count;
  172.         inptr += count;
  173.         incnt -= count;
  174.         size -= count;
  175.     }
  176.     return (n);
  177. }
  178.  
  179.  
  180.  
  181.  
  182.  
  183. #ifndef VMS   /* for VMS use code in vms.c (old VMS code below is retained
  184.                * in case of problems...will be removed in a later release) */
  185.  
  186. /*********************************/
  187. /* Function create_output_file() */
  188. /*********************************/
  189.  
  190. int create_output_file()         /* return non-0 if creat failed */
  191. {
  192. /*---------------------------------------------------------------------------
  193.     Create the output file with appropriate permissions.  If we've gotten to
  194.     this point and the file still exists, we have permission to blow it away.
  195.   ---------------------------------------------------------------------------*/
  196.  
  197. #if (!defined(DOS_OS2))
  198.     CR_flag = 0;   /* hack to get CR at end of buffer working */
  199. #endif
  200.  
  201. #if (defined(UNIX) && !defined(AMIGA))
  202.     {
  203.         int mask;
  204.  
  205. #ifndef VMS
  206.         if (!stat(filename, &statbuf) && (unlink(filename) < 0)) {
  207.             fprintf(stderr, "\n%s:  cannot delete old copy\n", filename);
  208.             return 1;
  209.         }
  210. #       define EXTRA_ARGS
  211. #else /* VMS */
  212. #       define EXTRA_ARGS   ,"rfm=stmlf","rat=cr"
  213. #endif /* ?VMS */
  214.  
  215.         mask = umask(0);   /* now know that we own it */
  216.         outfd = creat(filename, 0xffff & pInfo->unix_attr  EXTRA_ARGS);
  217.         umask(mask);                                            /* VMS, Unix */
  218.     }
  219. #else /* !UNIX || AMIGA */  /* file permissions set after file closed */
  220. #ifndef MACOS
  221.     outfd = creat(filename, S_IWRITE | S_IREAD);     /* DOS, OS2, Mac, Amiga */
  222. #else /* MACOS */
  223.     {
  224.         short fDataFork=TRUE;
  225.         MACINFO mi;
  226.         OSErr err;
  227.  
  228.         fMacZipped = FALSE;
  229.         CtoPstr(filename);
  230.         if (extra_field &&
  231.             (lrec.extra_field_length > sizeof(MACINFOMIN)) &&
  232.             (lrec.extra_field_length <= sizeof(MACINFO))) {
  233.             BlockMove(extra_field, &mi, lrec.extra_field_length);
  234.             if ((makeword((byte *)&mi.header) == 1992) &&
  235.                 (makeword((byte *)&mi.data) ==
  236.                   lrec.extra_field_length-sizeof(ZIP_EXTRA_HEADER)) &&
  237.                 (mi.signature == 'JLEE')) {
  238.                 gostCreator = mi.finfo.fdCreator;
  239.                 gostType = mi.finfo.fdType;
  240.                 fDataFork = (mi.flags & 1) ? TRUE : FALSE;
  241.                 fMacZipped = true;
  242.                 /* If it was Zipped w/Mac version, the filename has either */
  243.                 /* a 'd' or 'r' appended.  Remove the d/r when unzipping */
  244.                 filename[0]-=1;
  245.             }
  246.         }
  247.         if (!fMacZipped) {
  248.             if (!aflag)
  249.                 gostType = gostCreator = '\?\?\?\?';
  250.             else {
  251. #ifdef THINK_C
  252.                 gostCreator = 'KAHL';
  253. #else
  254. #ifdef MCH_MACINTOSH
  255.                 gostCreator = 'Manx';
  256. #else
  257.                 gostCreator = 'MPS ';
  258. #endif
  259. #endif
  260.                 gostType = 'TEXT';
  261.             }
  262.         }
  263.         PtoCstr(filename);
  264.  
  265.         outfd = creat(filename, 0);
  266.         if (fMacZipped) {
  267.             CtoPstr(filename);
  268.             if (hfsflag) {
  269.                 HParamBlockRec   hpbr;
  270.     
  271.                 hpbr.fileParam.ioNamePtr = (StringPtr)filename;
  272.                 hpbr.fileParam.ioVRefNum = gnVRefNum;
  273.                 hpbr.fileParam